const Question = require('../models/questions')
const User = require('../models/users')
class QuestionsCtl {
  // 检查问题是否存在中间件
  async checkQuestionExist(ctx, next) {
    const question = await Question.findById(ctx.params.id).select(
      '+questioner'
    )
    if (!question) {
      ctx.throw(404, '该问题不存在')
    }
    ctx.state.question = question
    await next()
  }
  // 检查是否是问题提问者中间件
  async checkQuestioner(ctx, next) {
    const { question } = ctx.state
    if (question.questioner._id.toString() !== ctx.state.user._id) {
      ctx.throw(403, '没有权限')
    }
    await next()
  }
  // 获取问题列表
  async find(ctx) {
    const { per_page = 10 } = ctx.query
    // 当前页
    const page = Math.max(ctx.query.page * 1, 1) - 1
    // 每页显示多少条，同时防止小于1的情况
    const perPage = Math.max(per_page * 1, 1)
    const q = new RegExp(ctx.query.q)
    // 同时匹配title或者description的模糊查询
    ctx.body = await Question.find({ $or: [{ title: q }, { description: q }] })
      .limit(perPage)
      .skip(page * perPage)
  }
  // 获取指定问题(获取某个问题下的话题列表)
  async findById(ctx) {
    const { fields = '' } = ctx.query
    const selectedFields = fields
      .split(';')
      .filter(v => v)
      .map(v => ' +' + v)
      .join('')
    const question = await Question.findById(ctx.params.id)
      .select(selectedFields)
      .populate('questioner topics')
    ctx.body = question
  }
  // 新建问题
  async create(ctx) {
    ctx.verifyParams({
      title: { type: 'string', required: true },
      description: { type: 'string', required: false }
    })
    const question = await new Question({
      ...ctx.request.body,
      questioner: ctx.state.user._id
    }).save()
    ctx.body = question
  }
  // 修改指定问题
  async update(ctx) {
    ctx.verifyParams({
      title: { type: 'string', required: false },
      description: { type: 'string', required: false }
    })
    await ctx.state.question.update(ctx.request.body)
    ctx.body = ctx.state.question
  }
  // 删除指定问题
  async delete(ctx) {
    await Question.findByIdAndRemove(ctx.params.id)
    ctx.status = 204
  }
  // 获取某个问题下的话题列表
  async listTopics(ctx) {
    const question = await Question.findById(ctx.params.id)
      .select('+topics')
      .populate('topics')
    ctx.body = question.topics
  }
  // 获取某个话题的关注用户列表
  async listQuestionsFollowers(ctx) {
    const users = await User.find({ followingQuestions: ctx.params.id })
    ctx.body = users
  }
}
module.exports = new QuestionsCtl()
